home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / ubppmpqs.zip / ppmp3b.asm < prev    next >
Assembly Source File  |  1993-04-16  |  6KB  |  403 lines

  1. ;PPMP3b.ASM 2.0
  2. ;    MACHINE LANGUAGE SUBROUTINES
  3. ;    FOR PPMPQS
  4. ;    1991/92 by YUJI KIDA
  5. ;
  6. .386P
  7.  
  8. code    segment    use16
  9.     assume    cs:code,ds:code
  10.  
  11.     INCLUDE    UBP.MAC
  12.     include    ppmp.h
  13.  
  14. org    100h
  15.  
  16. start:
  17.  
  18. ;branch
  19.  
  20.     MOV_AX    AR0        ;ARRAY[0] is the command
  21.     MOV    BX,OFFSET CMD_TBL
  22.     SHL    AX,1
  23.     ADD    BX,AX
  24.     JMP    CS:[BX]
  25.  
  26. CMD_TBL:
  27.     dw    initialize,getprime,storedecomdata,closefiles
  28.  
  29.     even
  30. P_OFF        dw    ?
  31. P_SEG        dw    ?
  32. primeadrnow    dd    ?
  33.  
  34. C_OFF        dw    ?
  35. C_SEG        dw    ?
  36.  
  37. primehandle    dw    ?
  38. decomhandle    dw    ?
  39.  
  40. FBsize        dw    ?
  41. primes        dw    ?
  42.  
  43. rowstotal    dw    ?
  44. rowslimit    dw    ?
  45. rowsnow        dw    ?
  46.  
  47. primenow    dw    ?
  48. offnow        dw    ?
  49.  
  50. ;
  51. ; close all files
  52. ;
  53. ;command#=3
  54.  
  55. closefiles:
  56.     mov    ah,3eh
  57.     mov    bx,cs:[decomhandle]
  58.     int    21h
  59.  
  60.     mov    ah,3eh
  61.     mov    bx,cs:[primehandle]
  62.     int    21h
  63.     retf
  64.  
  65. ;
  66. ; get and set primes
  67. ;
  68. ;command#=1
  69.  
  70. getprime:
  71.     lds    si,dword ptr cs:[P_OFF]
  72.  
  73.     lodsw
  74.     shl    ax,1
  75.     add    ax,si
  76.     mov    bx,ax
  77.     mov    word ptr [bx],0
  78.     mov    eax,[si]
  79.     mov    dword ptr cs:[BUFFER],eax
  80.     mov    edi,cs:[primeadrnow]
  81.     mov    fs:[edi],eax
  82.     add    edi,4
  83.     mov    cs:[primeadrnow],edi
  84.  
  85.     mov    ax,cs
  86.     mov    ds,ax
  87.  
  88.     mov    dx,offset BUFFER
  89.     mov    cx,4
  90.     mov    bx,[primehandle]
  91.     mov    ah,40h
  92.     int    21h
  93.     jc    short primediskerror
  94.  
  95. primeret:
  96.     mov    ax,ss
  97.     mov    ds,ax
  98.     retf
  99.  
  100. primediskerror:
  101.     mov    bx,AR0
  102.     mov    word ptr [bx],8001h
  103.     jmp    primeret
  104.  
  105. ;
  106. ; write factored data
  107. ;
  108. ;command#=2
  109.  
  110. setdata:
  111.     push    bx
  112.     mov    bx,[offnow]
  113.     mov    ax,[primenow]
  114.     mov    [bx],ax            ;set prime#
  115.     add    bx,2
  116.     mov    [offnow],bx
  117.     pop    bx
  118.     ret
  119.  
  120. storedecomdata:
  121.     push    bp
  122.  
  123.     mov    ax,cs:[rowstotal]
  124.     cmp    ax,cs:[rowslimit]
  125.     jae    div32incomplete        ;neglect this data
  126.  
  127.     inc    ax
  128.     mov    cs:[rowstotal],ax
  129.     mov    cs:[rowsnow],ax
  130.  
  131.     mov    cs:[primenow],0
  132.     mov    cs:[offnow],offset BUFFER
  133.  
  134.     lds    si,dword ptr cs:[C_off]
  135.     mov    ax,cs        ;transfer to 32 bit format
  136.     mov    es,ax        ;and copy to WBUFFER in cs
  137.     mov    bx,offset CBUFFER    ;reserve BX henceforce
  138.     mov    di,bx
  139.     xor    eax,eax
  140.     lodsw
  141.     test    ax,8000h    ;check sign
  142.     pushf            ;*
  143.     and    ax,1fffh
  144.     mov    cx,ax
  145.     inc    ax
  146.     shr    ax,1
  147.     stosd
  148.     rep    movsw
  149.     xor    ax,ax
  150.     stosw
  151.  
  152.     mov    ax,cs
  153.     mov    ds,ax
  154.  
  155.     popf            ;*
  156.     jz    div32positive
  157.     call    setdata
  158. div32positive:
  159.     mov    edi,primeadr+4    ;primeunitbytes    ;offset of 2
  160.  
  161.     STD
  162.  
  163.     movzx    ecx,[primes]
  164. div32LP:
  165.     push    ecx
  166.     inc    [primenow]
  167.     MOV    eBP,fs:[eDI]    ;ebp = denominator
  168. div3210:
  169.     MOV    SI,BX
  170.     MOV    AX,[SI]
  171.     MOV    CX,AX        ;dword length
  172.     SHL    AX,2
  173.     ADD    SI,AX        ;dword highest adr
  174.     XOR    eDX,eDX    
  175.     shr    cx,1
  176.     pushf            ;*
  177.     jcxz    div3221
  178.     align    4
  179. div3220:
  180.     LODSd
  181.     DIV    eBP
  182.     LODSd
  183.     DIV    eBP
  184.     LOOP    div3220
  185. div3221:
  186.     popf            ;*
  187.     jnc    div3222
  188.     LODSd
  189.     DIV    eBP
  190. div3222:
  191.     OR    eDX,eDX
  192.     JZ    short div32100    ;divide exactly if it can
  193.  
  194.     add    edi,4        ;primeunitbytes
  195.     pop    ecx
  196.     LOOP    div32LP
  197.  
  198.     cmp    dword ptr [bx],1
  199.     jne    short div32incomplete
  200.     cmp    dword ptr [bx+4],1
  201.     je    short div200
  202.  
  203. div32incomplete:        ;neglect this data
  204.     POP    BP
  205.     mov    bx,AR0
  206.     mov    word ptr [bx],101    ;error mark
  207.  
  208.     cld
  209.     mov    ax,ss
  210.     mov    ds,ax
  211.     mov    es,ax
  212.     retf
  213.  
  214.  
  215. div32100:
  216.     call    setdata
  217.  
  218.     MOV    SI,BX
  219.     MOV    AX,[SI]
  220.     xor    ecx,ecx
  221.     MOV    CX,AX        ;dword length
  222.     SHL    AX,2
  223.     ADD    SI,AX        ;highest adr
  224.     XOR    eDX,eDX    
  225.  
  226.     LODSd
  227.     DIV    eBP
  228.     PUSH    eAX        ;push highst dword
  229.     JMPS    div32120
  230.     align    4
  231. div32110:
  232.     LODSd
  233.     DIV    eBP
  234. div32120:
  235.     MOV    [SI+4],eAX
  236.     LOOP    div32110
  237.  
  238.     POP    eAX        ;check highest dword
  239.     OR    eAX,eAX
  240.     JNZ    div32130
  241.     dec    dword ptr [bx]    ;dec length if highest=0
  242. div32130:
  243.     JMP    div3210
  244.  
  245.  
  246.     ;write result
  247. div200:
  248.     cld
  249.     mov    ax,[offnow]
  250.     mov    bx,offset BUFFER0
  251.     sub    ax,bx
  252.     mov    cx,ax            ;byte size
  253.     sub    ax,2
  254.     shr    ax,1
  255.     mov    [bx],ax            ;number of factors
  256.     mov    dx,bx
  257.     mov    bx,[decomhandle]
  258.     mov    ah,40h            
  259.     int    21h
  260.     jc    short decomdiskerror
  261.  
  262. decomret:
  263.     pop    bp
  264.     MOV    AX,SS
  265.     MOV    DS,AX
  266.     MOV    ES,AX
  267.     RETF
  268.  
  269. decomdiskerror:
  270.     mov    bx,AR0
  271.     mov    word ptr [bx],8001h
  272.     jmp    decomret
  273.  
  274. ;
  275. ;* Initialize
  276. ;COMMAND#=0
  277.  
  278. ;    V1=P
  279. ;    V2=C#
  280. ;    AR[1]    TOTAL SIZE \ 2
  281.  
  282. INITIALIZE:
  283.     mov    ax,cs
  284.     mov    ds,ax
  285.     mov    es,ax
  286.  
  287.     MOV    BX,V1        ;adr of p
  288.     MOV    AX,[BX]
  289.     MOV    [P_OFF],AX
  290.     MOV    AX,[BX+2]
  291.     MOV    [P_SEG],AX
  292.  
  293.     MOV    BX,V2        ;adr of C#
  294.     MOV    AX,[BX]
  295.     MOV    [C_OFF],AX
  296.     MOV    AX,[BX+2]
  297.     MOV    [C_SEG],AX
  298.  
  299.     MOV_AX    AR1
  300.     shl    ax,1
  301.     mov    [FBsize],ax
  302.     dec    ax
  303.     mov    [primes],ax
  304.  
  305.     mov    [rowstotal],0
  306.     mov    [rowsnow],0
  307.  
  308.     mov    eax,primeadr
  309.     mov    [primeadrnow],eax
  310.     movzx    ebx,[FBsize]
  311.     mov    ecx,ebx
  312.     mov    [rowslimit],bx
  313.  
  314.     ;create files
  315.  
  316.     mov    dx,offset primefilename
  317.     mov    ah,3ch            ;create handle
  318.     mov    cx,0
  319.     int    21h
  320.     jc    diskerror
  321.     mov    [primehandle],ax
  322.  
  323.     mov    dx,offset decomfilename
  324.     mov    ah,3ch            ;create handle
  325.     mov    cx,0
  326.     int    21h
  327.     jc    diskerror
  328.     mov    [decomhandle],ax
  329.  
  330.     ; make GDT
  331.  
  332.     mov    ax,cs
  333.     and    eax,0ffffh
  334.     shl    eax,4
  335.     add    eax,offset gdttbl
  336.     mov    dword ptr cs:[gdtaddr+2],eax
  337.     lgdt    cs:[gdtaddr]
  338.  
  339.     cld
  340.     cli
  341.  
  342.     mov    eax,cr0        ;set PE bit
  343.     or    eax,1        ;
  344.     mov    cr0,eax        ;
  345.     jmp    $+2        ;flush buffer
  346.  
  347.     mov    ax,8        ;now in protect mode
  348.     mov    fs,ax
  349.  
  350.     mov    eax,cr0        ;reset PE bit
  351.     and    eax,07ffffffeh    ;
  352.     mov    cr0,eax        ;
  353.     jmp    $+2        ;flush buffer
  354.  
  355.     sti
  356.  
  357.     mov    ax,ss
  358.     mov    ds,ax
  359.     mov    es,ax
  360.     retf
  361.  
  362. diskerror:
  363.     mov    bx,AR0
  364.     mov    word ptr [bx],8001h
  365.     mov    ax,ss
  366.     mov    ds,ax
  367.     mov    es,ax
  368.     retf
  369.  
  370.  
  371. descriptor    struc
  372.     limit_0_15    dw    0
  373.     base_0_15    dw    0
  374.     base_16_23    db    0
  375.     access        db    0
  376.     gran        db    0
  377.     base_24_31    db    0
  378. descriptor    ends
  379.  
  380. data_seg_access    equ    092h
  381.  
  382. gdtaddr    label    qword
  383.     dw    2*8        ;size of GDT table
  384.     dd    ?
  385.     dw    0
  386. gdttbl    label    dword
  387.  
  388. gdt_null    descriptor <,,,,,>
  389. gdt_extra    descriptor <0ffffh,0,0,data_seg_access,0cfh,0>
  390.  
  391.  
  392. primefilename    db    'PPMPPRMS.PPM',0
  393. decomfilename    db    'PPMPDCMP.PPM',0
  394.  
  395.  
  396.     even
  397. CBUFFER        dw    600 dup(0)
  398. BUFFER0    dw    ?
  399. BUFFER    dw    1024 dup(0)
  400.  
  401. CODE    ENDS
  402. END    START
  403.